package net.gnehzr.tnoodle.js; import static net.gnehzr.tnoodle.utils.GwtSafeUtils.azzert; import net.gnehzr.tnoodle.scrambles.Puzzle; import net.gnehzr.tnoodle.scrambles.InvalidScrambleException; import net.gnehzr.tnoodle.scrambles.PuzzleImageInfo; import net.gnehzr.tnoodle.scrambles.PuzzlePlugins; import net.gnehzr.tnoodle.svglite.Color; import net.gnehzr.tnoodle.svglite.Svg; import java.util.HashMap; import java.util.logging.Level; import java.util.logging.Logger; import org.timepedia.exporter.client.Exportable; import org.timepedia.exporter.client.Export; import org.timepedia.exporter.client.ExportPackage; import com.google.gwt.dom.client.Element; import com.google.gwt.user.client.ui.Image; import com.google.gwt.json.client.JSONObject; import com.google.gwt.json.client.JSONString; import com.google.gwt.json.client.JSONNumber; import com.google.gwt.json.client.JSONArray; import com.google.gwt.json.client.JSONValue; import com.google.gwt.core.client.JavaScriptObject; @ExportPackage("") @Export("tnoodlejs") public class TNoodleJsUtils implements Exportable { private TNoodleJsUtils() {} public static void setLogLevel(String levelStr) { setLogLevel(levelStr, ""); } public static void setLogLevel(String levelStr, String loggerStr) { Level level = Level.parse(levelStr); azzert(level != null); Logger logger = Logger.getLogger(loggerStr); logger.setLevel(level); } public static String getLogLevel() { return getLogLevel(""); } public static String getLogLevel(String loggerStr) { Level level = Logger.getLogger(loggerStr).getLevel(); return level == null ? null : level.getName(); } public static String scrambleToSvg(String scramble, Puzzle puzzle, String scheme) throws InvalidScrambleException { HashMap<String, Color> colorScheme = puzzle.parseColorScheme(scheme); Svg svg = puzzle.drawScramble(scramble, colorScheme); return svg.toString(); } public static String getVersion() { return ScrambleJsEntryPoint.VERSION; } public static Element getPuzzleIcon(Puzzle puzzle) { String filename = PuzzlePlugins.PUZZLE_PACKAGE + "/" + puzzle.getShortName() + ".png"; if(ScrambleJsEntryPoint.resources.containsKey(filename)) { Image image = new Image(); image.setUrl("data:image/png;base64," + ScrambleJsEntryPoint.resources.get(filename)); return image.getElement(); } return null; } private static JSONValue toJSONValue(Object obj) { if(obj instanceof HashMap) { HashMap<String, Object> map = (HashMap<String, Object>) obj; JSONObject jsonObj = new JSONObject(); for(String key : map.keySet()) { jsonObj.put(key, toJSONValue(map.get(key))); } return jsonObj; } else if(obj instanceof String) { return new JSONString((String) obj); } else if(obj instanceof Integer) { return new JSONNumber((Integer) obj); } else if(obj instanceof double[]) { JSONArray jsonArr = new JSONArray(); double[] arr = (double[]) obj; for(int i = 0; i < arr.length; i++) { jsonArr.set(i, new JSONNumber(arr[i])); } return jsonArr; } else if(obj instanceof Object[]) { JSONArray jsonArr = new JSONArray(); Object[] arr = (Object[]) obj; for(int i = 0; i < arr.length; i++) { jsonArr.set(i, toJSONValue(arr[i])); } return jsonArr; } else { azzert(false, "Unrecognized type " + obj.getClass()); return null; } } public static JavaScriptObject getPuzzleImageInfo(Puzzle puzzle) { HashMap<String, Object> pii = new PuzzleImageInfo(puzzle).toJsonable(); JSONObject jso = (JSONObject) toJSONValue(pii); return jso.getJavaScriptObject(); } }